package poker;
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.awt.event.*;

public class PokerTafelGUI extends JPanel implements ActionListener
{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public static int FOLD_CHECK_BET_OPTION = 30;
	public static int FOLD_CALL_OPTION = 32;
	public static int NO_OPTION = 33;
	public int option;
	
	private HoofdSchermGUI hgui;
	private SpelRonde spelronde;
	public Deelname deelname;
	
	private JButton fold = new JButton("Fold");
	private JButton check = new JButton("Check");
	private JButton call = new JButton("Call");
	private JButton bet = new JButton("Bet");
	private JButton raise = new JButton("Raise");
	private JButton allIn = new JButton("All in");
	
	HashMap<Integer,SpelerTafelGUI> spelerTafels = new HashMap<Integer,SpelerTafelGUI>();
	SpelerTafelGUI dealer;
	
	private boolean hasBet = false;
	int callInzet = 0;
	int betInzet = 0;
	
	private JPanel spelersPanel = new JPanel();
	KaartMidGUI kaarten = new KaartMidGUI();
	private JPanel knoppen = new JPanel();	
	
	private Color backGround = new Color(0, 128, 0);		// groen zoals poker tafel
	
	public PokerTafelGUI(HoofdSchermGUI g1)
	{	
		hgui = g1;
		fold.addActionListener(this);
		check.addActionListener(this);
		call.addActionListener(this);
		bet.addActionListener(this);
		raise.addActionListener(this);
		allIn.addActionListener(this);
		setBackground(backGround);
		knoppen.setBackground(backGround);
		
		//-------------------------------------------------
		// 3 JPanels
		// 1 voor alle spelers (boven)
		// 1 voor de kaarten in het midden (midden dus :o)
		// 1 voor de knoppen voor fold/check/bet etc
		//-------------------------------------------------
		
		setLayout( new BoxLayout(this, BoxLayout.Y_AXIS) );
		
		//-------------------------------------------------
		// Eerst maar ff tafel met spelers dan
		//-------------------------------------------------
		
		spelersPanel.setBackground(backGround);
		spelersPanel.setLayout( new GridLayout(1,10) );
		
		int c = 0;
		if(g1.client.spel != null){
			Deelname d;
			for(Iterator<Deelname> i = g1.client.spel.sr.deelnames.iterator(); i.hasNext(); c++)
			{
				d = i.next();
				SpelerTafelGUI stg  = new SpelerTafelGUI(hgui, d);
				if(d.isDealer)
					stg.setDealer(true);
				spelersPanel.add( stg );
				spelerTafels.put(d.speler.spelerId, stg);
			}
		}
		
		add(spelersPanel);
		add(kaarten);
		add(knoppen);
	}
	
	public void removeAllCards()
	{
		SpelerTafelGUI s;
		for(Iterator i = spelerTafels.keySet().iterator(); i.hasNext(); )
		{
			s = (SpelerTafelGUI)i.next();
			s.kaart.removeCards();
		}
	}
	
	public void updateDealer(Client c)
	{
		dealer.setDealer(false);
		spelerTafels.get( c.deelname.speler.spelerId ).setDealer(true);
	}
	
	public void setSpelerSaldo(int d, double saldo)
	{
		spelerTafels.get(d).setSaldo(saldo);
	}
	public void setGegevens(int d, double saldo, String naam)
	{
		spelerTafels.get(d).setGegevens(naam, saldo);
	}
	
	public void setLastAction(int d)
	{	
		spelerTafels.get(d).setLastAction();
	}
	
	public void updateFold(int d)
	{
		spelerTafels.get(d).setFold();
		validate();
		repaint();
	}
	
	/*public void updateNaam(int d)
	{
		spelerTafels.get(d).setNaam();
	}
	*/
	
	public void showButtons(int option)
	{
		knoppen.removeAll();
		if(option != NO_OPTION)
		{

			if (hgui.client.deelname.speler.getSaldo() == 0)
			{
				hgui.client.interrupt();
				return;
			}
			if(hgui.client.deelname.speler.getSaldo() <= hgui.client.deelname.verschil)
				option = FOLD_CALL_OPTION;
		}
		if(option == FOLD_CHECK_BET_OPTION)
		{
			showFoldButton();
			showCheckButton();
			showBetButton();
		} else if(option == FOLD_CALL_OPTION)
		{
			if(hgui.inzetRonde == 2 && hgui.client.deelname.verschil == 0)
			{
				hgui.client.interrupt();
				return;
			}
			showFoldButton();
			showCheckButton();
		}		
		validate();
	}
	
	private void showFoldButton()
	{
		knoppen.add(fold);
	}
	
	private void showCheckButton()
	{
		if(hgui.client.deelname.verschil == 0)
		{
			knoppen.add(check);
		} else if(hgui.client.deelname.speler.getSaldo() >= hgui.client.deelname.verschil) {
			callInzet = hgui.client.deelname.verschil;
			call.setText("Call (" + callInzet + ")");
			knoppen.add(call);
		} else {
			knoppen.add(allIn);
		}
	}
	
	private void showBetButton()
	{
		betInzet = hgui.client.deelname.verschil + Deelname.BIG_BLIND;
		if(hgui.client.deelname.verschil == 0)
		{
			bet.setText("Bet (" + betInzet + ")");
			knoppen.add(bet);
		} else {
			raise.setText("Raise (" + betInzet + ")");
			knoppen.add(raise);
		}
	}
	
	public void actionPerformed(ActionEvent e)
	{
		if (e.getSource() == fold)
		{
			hgui.fold();
		}
		if(e.getSource() == check) {
			hgui.check();
		}
		if(e.getSource() == call) 
		{
			hgui.call(callInzet);
		}
		if(e.getSource() == bet) 
		{
			hgui.bet(betInzet);
		}
		if(e.getSource() == raise) 
		{
			hgui.raise(betInzet);
		}
		if(e.getSource() == allIn)
		{
			hgui.allIn();
		}
		setLastAction(hgui.client.deelname.speler.spelerId);
	}
	
	public String toString()
	{
		return "PokerTafelGUI";
	}
}